package cn.wolfcode.timer;

import cn.wolfcode.luowowo.domain.Strategy;
import cn.wolfcode.luowowo.redis.RedisKey;
import cn.wolfcode.luowowo.redis.StrategyStatisVO;
import cn.wolfcode.luowowo.redis.srevice.IStrategyRedisSrevice;
import cn.wolfcode.luowowo.service.IStrategyService;
import com.alibaba.fastjson.JSON;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 定时器 用springboot自带的
 */
@Component
public class SpringBootTask {
    //注入对象,等会使用定时器尝试将数据化持久化
    @Autowired
    private IStrategyRedisSrevice strategyRedisSrevice;
    @Autowired
    private IStrategyService strategyService;
    @Autowired
    private StringRedisTemplate redisTemplate;
    //先写一个简单的试试
    //cron 表达式的顺序是
    //秒 分钟 小时 日 月 星期 年   在springboot里面是没有年的 所以就是6个单位
    /*@Scheduled(cron = "0/10 * * * * ? ")
    public void doWork(){
//        System.out.println("执行次数");
    }*/
    
    @Scheduled(cron = "0 0 0,13 * * ?")
    public void LastingStrategyStatis() {
       /* //首先获取全部的攻略,循环获取他们的id
        List<Strategy> strategies = strategyService.list();
        //通过拼接他们的id获得key,去判断redis中是否有他们的key,
        for (Strategy strategy : strategies) {
            //拼接key
            String key = RedisKey.STRATEGY_STATIS_KEY.join(strategy.getId());
            //进行判断key的存在状态
            if (redisTemplate.hasKey(key)){
                //如果有的话就要进行持久化操作,获取他们在redis中的value:vo对象 然后使用beanUtils.copy的方法将值传进mongodb里面
                String vo = redisTemplate.opsForValue().get(key);
                //将json类型的vo转换成vo对象
                StrategyStatisVO vo1 = JSON.parseObject(vo, StrategyStatisVO.class);
                //传值进攻略中
                BeanUtils.copyProperties(vo1,strategy);
                //更新mongodb的数据
                strategyService.updateStatis(strategy);
                System.out.println("正在进行持久化操作");
            }
            // 没有就说明他们暂时是没有数据的 可以不用持久化
        }
        */
//        还有另外一种方案,因为key的前缀都是一样的,所以可以通过key的前缀作为条件进行模糊查找
//        模糊查找除了固定的前缀外,就剩一个攻略的id,攻略的id就用*代替,查找全部的,前缀唯一的key的vo对象
//        先获取所有的vo对象,然后将vo对象update进mongodb中
        //获取所有的vo对象 通过指定的key
        List<StrategyStatisVO>list = strategyRedisSrevice.selectStrategyVoByPrefix();
        //然后接下来的操作与第一次的方式类似,就是将获取的vo对象更新到攻略中进行保存
        for (StrategyStatisVO vo : list) {
            //通过vo里面的id获取攻略的对象
            Strategy strategy = strategyService.get(vo.getStrategyId());
            //传值进攻略中
            BeanUtils.copyProperties(vo,strategy);
            //更新mongodb的数据
            strategyService.updateStatis(strategy);
            System.out.println("正在进行持久化操作");
        }
    }
}
